package pres.seanlang.utility;

import java.io.File;
import java.io.InputStream;
import java.io.OutputStream;

/**
 *  文件操作工具类
 *
 * @author SeanLang
 */
public class FileUtils {
    protected FileUtils() { throw new UnsupportedOperationException("can't instance..."); }

    /**
     *  创建目录, 如果不存在且不是目录就进行创建。
     * @param dst
     * @return
     */
    public static boolean mkdir(File dst) {
        if(dst != null && !dst.exists()) {
            return dst.mkdirs();
        } else {
            return false;
        }
    }

    /**
     *  创建目录
     * @param path
     * @return
     */
    public static boolean mkdir(String path) {
        return mkdir(new File(path));
    }

    /**
     *  创建空白文件.
     * @param dst
     * @return
     */
    public static boolean mk(File dst) {
        try {
            mkdir(dst.getParentFile());
            return dst.createNewFile();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return false;
    }

    /**
     *  创建空白文件
     * @param path
     * @return
     */
    public static boolean mk(String path) {
        return mk(new File(path));
    }

    /**
     *  删除文件或者目录
     * @param dst   要删除的目标file
     * @return
     */
    public static boolean rm(File dst) {
        if(dst != null && dst.exists()) {
            if(dst.isDirectory()) {     //删除子目录
                File[] files = dst.listFiles();
                for(File file: files) {
                    rm(file);
                }
            }
            return dst.delete();
        } else {
            return false;
        }
    }

    /**
     *  删除文件或者目录
     * @param path
     * @return
     */
    public static boolean rm(String path) {
        return rm(new File(path));
    }

    /**
     *  复制文件或者目录
     * @param src
     * @param dst
     * @return
     */
    public static boolean cp(File src, File dst) {
        if(src == null || dst == null
                || !src.exists()) {
            return false;
        } else {
            if(src.isDirectory()) {
                File cpRoot = new File(dst, src.getName());
                mkdir(cpRoot);

                File[] files = src.listFiles();
                for(File file: files) {
                    cp(file, new File(cpRoot, file.getName()));
                }

                return true;
            } else {
                /*try {
                    InputStream in = new FileInputStream(src);
                    if(dst.isDirectory()) {
                        dst = new File(dst, src.getName());
                    }
                    OutputStream out = new FileOutputStream(dst);
                    if(StreamUtils.copy(in, out) > 0) {
                        return true;
                    }
                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                }

                return false;*/
                InputStream in = StreamUtils.openInputStream(src.getPath());
                dst = dst.isDirectory() ? new File(dst, src.getName()) : dst;
                OutputStream out = StreamUtils.openOutputStream(dst.getPath());
                return StreamUtils.copy(in, out, true) != StreamUtils.EOF;
            }
        }
    }

    /**
     *  复制文件或者目录
     * @param src
     * @param dst
     * @return
     */
    public static boolean cp(String src, String dst) {
        return cp(new File(src), new File(dst));
    }
}
